// bzoj1123
// 题意：给定n(<=100000)个点，m(<=500000)条无向边，问去了第i个点后，
//       多少点对不能连通（这个点对是n^2的点对中不能连通的数目，包括去
//       掉的点自己）。输出取掉1到n点，分别的不连通点对数目。
//
// 题解：tarjan算法，如果某个点不是割点，那么取掉它就只有2*(n-1)个点对，
//       如果是割点，那么取掉它之后会形成若干个树，其中一个树是包括这个
//       割点所在联通的点。然后tarjan的时候顺便维护size和ans就好。
//       如果你缩点后重新构图，会非常难敲。
//
// run: $exec < input
// opt: 0
// flag: -g
#include <cstdio>
#include <algorithm>

int const maxn = 100007;
int const maxm = 500007;
int head[maxn], end_point[2 * maxm], next[2 * maxm];
int alloc = 2;
int n, m;

int low[maxn], dfn[maxn];
int tick;

int size[maxn];
long long ans[maxn];

void tarjan(int u, int parent)
{
	low[u] = dfn[u] = ++tick;
	size[u] = 1;
	long long sum = 0;
	for (int p = head[u]; p; p = next[p]) {
		int v = end_point[p];
		if (v == parent) continue;
		if (!dfn[v]) {
			tarjan(v, u);
			size[u] += size[v];
			low[u] = std::min(low[u], low[v]);
			if (dfn[u] <= low[v]) { // judge for cut point u
				ans[u] += 2ll * sum * size[v];
				sum += size[v];
			}
		} else low[u] = std::min(low[u], dfn[v]);
	}
	ans[u] += 2ll * sum * (n - sum - 1) + 2 * (n - 1);
}

void add_edge(int u, int v)
{
	end_point[alloc] = v; next[alloc] = head[u]; head[u] = alloc++;
	end_point[alloc] = u; next[alloc] = head[v]; head[v] = alloc++;
}

int main()
{
	std::scanf("%d%d", &n, &m);
	for (int i = 0, x, y; i < m; i++) {
		std::scanf("%d%d", &x, &y);
		add_edge(x, y);
	}
	for (int i = 1; i <= n; i++)
		if (!dfn[i]) tarjan(i, -1);

	for (int i = 1; i <= n; i++)
		std::printf("%lld\n", ans[i]);
}

